package org.ahead4.joint.dto;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.Data;
import org.ahead4.joint.utils.SignUtils;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 请求信封
 * @author WangYu
 * @title: RequestEnvelope
 * @description: TODO
 * @date 2020/3/1314:44
 */
@Data
public class RequestEnvelope {
    private String appid;
    private String data;
    private String sign;
    private Long stamptime;

    public String toJSONString() {
        return JSON.toJSONString(this);
    }

    /**
     * 将RequestEnvelope对象转换成待签名Map集合
     * @param requestData
     * @return
     */
    public static Map<String, String> convert(RequestEnvelope requestData) {
        JSONObject jsonMap = ((JSONObject) JSON.toJSON(requestData));
        Map<String, String> map = new HashMap<>();
        for (Map.Entry<?, ?> entry : jsonMap.entrySet()) {
            String key = entry.getKey() != null ? (entry.getKey() + "") : "";
            String val = entry.getValue() != null ? (entry.getValue() + "") : "";
            map.put(key, val);
        }
        map.remove("sign");
        return map;
    }

    /**
     * 构建签名的RequestEnvelope对象
     * @param appid 接入应用编号
     * @param data 待传输数据
     * @param stamptime 时间戳
     * @param secretKey 密钥
     * @param secretKeyType 密钥类型
     * @return 请求信封对象
     */
    public static RequestEnvelope build(String appid, String data, Long stamptime, String secretKey, String secretKeyType) {
        RequestEnvelope requestData = new RequestEnvelope();
        requestData.appid = appid;
        requestData.data = data;
        requestData.stamptime = stamptime;
        requestData.sign = SignUtils.sign(convert(requestData), secretKey, secretKeyType);
        return requestData;
    }

    /**
     * 构建签名的RequestEnvelope对象，时间戳取当前时间
     * @param appid 接入应用编号
     * @param data 待传输数据
     * @param secretKey 密钥
     * @param secretKeyType 密钥类型
     * @return
     */
    public static RequestEnvelope build(String appid, String data, String secretKey, String secretKeyType) {
        return build(appid, data, new Date().getTime(), secretKey, secretKeyType);
    }

    /**
     * 构建MD5签名的RequestEnvelope对象，时间戳取当前时间
     * @param appid 接入应用编号
     * @param data 待传输数据
     * @param secretKey 密钥
     * @return
     */
    public static RequestEnvelope buildMD5(String appid, String data, String secretKey) {
        return build(appid, data, new Date().getTime(), secretKey, "MD5");
    }

    /**
     * 构建MD5签名的RequestEnvelope对象，时间戳取当前时间
     * @param appid 接入应用编号
     * @param data 数据列表
     * @param secretKey 密钥
     * @return
     */
    public static RequestEnvelope buildMD5(String appid, List data, String secretKey) {
        return build(appid, JSON.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect), new Date().getTime(), secretKey, "MD5");
    }
}
